package com.jindy.module.serialNum.service.impl;

import com.jindy.common.constant.Constants;
import com.jindy.common.utils.DateUtils;
import com.jindy.common.utils.StringUtils;
import com.jindy.module.outboundorder.service.impl.OutboundOrderServiceImpl;
import com.jindy.module.serialNum.domain.SySerialNumT;
import com.jindy.module.serialNum.mapper.SySerialNumTMapper;
import com.jindy.module.serialNum.service.ISySerialNumTService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 单流水生成Service业务层处理
 * 
 * @author jindy
 * @date 2023-04-16
 */
@Service
public class SySerialNumTServiceImpl implements ISySerialNumTService 
{
    private static final Logger LOGGER = LoggerFactory.getLogger(SySerialNumTServiceImpl.class);
    @Resource
    private SySerialNumTMapper sySerialNumTMapper;

    /**
     * 查询单流水生成
     * 
     * @param id 单流水生成主键
     * @return 单流水生成
     */
    @Override
    public SySerialNumT selectSySerialNumTById(Long id)
    {
        return sySerialNumTMapper.selectSySerialNumTById(id);
    }

    /**
     * 查询单流水生成列表
     * 
     * @param sySerialNumT 单流水生成
     * @return 单流水生成
     */
    @Override
    public List<SySerialNumT> selectSySerialNumTList(SySerialNumT sySerialNumT)
    {
        return sySerialNumTMapper.selectSySerialNumTList(sySerialNumT);
    }

    /**
     * 新增单流水生成
     * 
     * @param sySerialNumT 单流水生成
     * @return 结果
     */
    @Override
    public int insertSySerialNumT(SySerialNumT sySerialNumT)
    {
        sySerialNumT.setCreateTime(DateUtils.getNowDate());
        return sySerialNumTMapper.insertSySerialNumT(sySerialNumT);
    }

    /**
     * 修改单流水生成
     * 
     * @param sySerialNumT 单流水生成
     * @return 结果
     */
    @Override
    public int updateSySerialNumT(SySerialNumT sySerialNumT)
    {
        sySerialNumT.setUpdateTime(DateUtils.getNowDate());
        return sySerialNumTMapper.updateSySerialNumT(sySerialNumT);
    }

    /**
     * 批量删除单流水生成
     * 
     * @param ids 需要删除的单流水生成主键
     * @return 结果
     */
    @Override
    public int deleteSySerialNumTByIds(Long[] ids)
    {
        return sySerialNumTMapper.deleteSySerialNumTByIds(ids);
    }

    /**
     * 删除单流水生成信息
     * 
     * @param id 单流水生成主键
     * @return 结果
     */
    @Override
    public int deleteSySerialNumTById(Long id)
    {
        return sySerialNumTMapper.deleteSySerialNumTById(id);
    }

    /**
     * 生成流水单号
     * @param processType
     * @return
     */
    @Override
    public String generateSerialNum(String processType) {
        return createSerialNum(processType);
    }

    /**
     * 生成流水单号
     * @param processType
     * @return
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED)
    public synchronized String createSerialNum(String processType) {
        //当天日期
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate formatDate = LocalDate.now();
        String dateStr = formatDate.format(df);
        String processDate =dateStr.replaceAll("-", "").substring(2);
        LOGGER.info(StringUtils.format("生成流水单号的日期：{}",processDate));

        Integer serial;
        SySerialNumT SySerialNumT = new SySerialNumT();
        SySerialNumT.setDataState("1");
        SySerialNumT.setProcessType(processType);
        SySerialNumT.setProcessDate(processDate);
        //获取流水表单类型记录
        SySerialNumT serialNum = selectSySerialNumT(SySerialNumT);
        if (null == serialNum) {
            LOGGER.info("生成流水单号的新增");
            serial = 1;
            sySerialNumTMapper.insertSySerialNumT(new SySerialNumT(processType, processDate, serial, Constants.DATA_VALID_STATE));
        } else {
            serial = serialNum.getSerial() + 1;
            serialNum.setSerial(serial);
            LOGGER.info(StringUtils.format("生成流水单号的修改：{}",serial));
            sySerialNumTMapper.updateSySerialNumT(serialNum);
        }
        String serialTmp = String.valueOf(serial);
        if (serial < (Math.pow(10, 4))) {
            serialTmp = String.format("%0" + 4 + "d", serial);
        }
        LOGGER.info(StringUtils.format("生成流水单号的完整单号：{}",serialTmp));
        return new StringBuilder(processType).append(processDate).append(serialTmp).toString();
    }

    /**
     * 查询表单流水生成
     *
     * @param SySerialNumT 表单流水生成表
     * @return 表单流水生成表
     */
    public SySerialNumT selectSySerialNumT(SySerialNumT SySerialNumT)
    {
        SySerialNumT bizSerialNum=null;
        List<SySerialNumT> SySerialNumTS = sySerialNumTMapper.selectSySerialNumTList(SySerialNumT);
        if (!CollectionUtils.isEmpty(SySerialNumTS)){
            bizSerialNum = SySerialNumTS.get(0);
        }
        return bizSerialNum;
    }
}
